unit u_Core;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils,u_DM_For_XML;

type
  T_Core_errors=(NOERROR,ERROR); //Коды ошибок возвращаемых функциями модуля u_Core. а надо ли.
  T_test_status=(AVAILABLE,COMPLETE,NOTAVAILABLE);//можно добавить проваленные или ещё какие
  T_Access_type=(TEACHER,STUDENT); //Может в будущем ещё появятся

  Ttest=class(TObject)        //Есть ещё такой вариант - храним только ID тестов и запрашиваем информацию по ID
    public
      function f_Get_name(out name:string):T_Core_errors;
      function f_Get_status(out status:T_test_status):T_Core_errors;
             //Не совсем понял, как правильно добавить конструктор с параметрами
      constructor Create(ID:integer); overload;  //и чем отличается overload от override
    private
      i_ID:integer;
  end;

  TUser = class(TObject)
  private
    Access_type:T_Access_type;  //Стоит ли хранить всю эту информацию
    i_ID:integer;      //для студентов логин и ID - это шифр, у преподавателей есть шифр?
  public
    function f_Get_access_type(out Acc_type:T_Access_type):T_Core_errors;
    function f_Get_tests_list(list:TList):T_Core_errors;  // а может лучше и array, вместо TList
    function f_Get_Students_list(list:TList):T_Core_errors;
    constructor Create;
  end;

  function f_Authentication(const s_Login: string; const s_Password:string;  out b_Aut_res:boolean):T_Core_errors;

  var
  user: TUser;

implementation

function  f_Authentication(const s_Login: string; const s_Password:string;  out b_Aut_res:boolean):T_Core_errors;
begin
 // в дальнейшем будет передавать лог/пас в u_DM_For_XML
  b_Aut_res:=FALSE;
  if s_Login>'' then
    begin
      b_Aut_res:=TRUE;
      user:=TUser.Create;
    end;
  result:=NOERROR;
end;

                {TUSER}

constructor TUser.Create;
begin
  i_ID:=0;
  Access_type:=STUDENT;
end;


function TUser.f_Get_access_type(out Acc_type:T_Access_type):T_Core_errors;
begin
  Acc_type:=Access_type;
  result:=NOERROR;
end;

function TUser.f_Get_tests_list(list:TList):T_Core_errors; // Обращаемя в БД и получаем список тестов, которые доступны пользователю
var
  i:integer;
begin
  list.Add(Ttest.Create(0));
  //Ttest(list.Items[0]).i_ID:=0;  не понял, почему это можно сделать, ведь i_ID объявлен как private.
  list.Add(Ttest.Create(1));
  result:=NOERROR
end;


function TUser.f_Get_Students_list(list:TList):T_Core_errors; //Обращаемся к БД и выводим список студентов
begin
  result:=NOERROR
end;

               {TTEST}

constructor TTest.Create(ID:integer); overload;
begin
  inherited Create();
  i_ID:=ID;
end;

function TTest.f_Get_name(out name:string):T_Core_errors; //Обращаемся к БД и берём оттуда имя по ID
begin
  name:='Тест№'+IntToStr(Self.i_ID); //это пока что
  result:=NOERROR;
end;

function TTest.f_Get_status(out status:T_test_status):T_Core_errors; //Обращаемся к БД и берём оттуда статус по ID
begin
  if i_ID=0 then status:=AVAILABLE
  else status:=COMPLETE;
  result:=NOERROR;
end;

end.
